#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef int ElemSet; /* 默认元素为整数*/
#define Swap(x, y) { ElemSet t = x; x = y; y = t; }

/* 算法10-15：计数排序 CountingSort(a,l,r,k) */
void CountingSort(ElemSet *a, int l, int r, ElemSet k) {
    ElemSet *b;
    int *cnt, i, p;

    b = (ElemSet *)malloc(sizeof(ElemSet) * (r - l +
                          1)); /* 临时存放有序序列的数组 */
    cnt = (int *)malloc(sizeof(int) * (k + 1)); /* 计数数组 */
    memset(cnt, 0, sizeof(int) * (k + 1)); /* 初始全零 */
    for (i = l; i <= r; i++) {
        cnt[a[i]]++;
    }
    for (i = 1; i <= k; i++) {
        cnt[i] += cnt[i - 1];
    }
    for (i = r; i >= l; i--) {
        p = cnt[a[i]] -
            1; /* a[i]应该在b中的位置。注意b数组下标从0开始 */
        b[p] = a[i]; /* 将a[i]放入 */
        cnt[a[i]]--;
    }
    for (i = l; i <= r; i++) {
        a[i] = b[i - l]; /* 将有序的b放回a中。注意b数组下标从0开始 */
    }
}
/* 算法10-15 结束 */

#define kMaxKey 1000

int main(void) {
    ElemSet *a; /* 数组a的下标从0开始 */
    int n, i;

    scanf("%d", &n);
    a = (ElemSet *)malloc(sizeof(ElemSet) * n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    CountingSort(a, 0, n - 1, kMaxKey);
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}